<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 第一种写法
        // Function.prototype.mycall = function(ctx,...args){

        //     ctx = (ctx === null || ctx === undefined)?window:Object(ctx)

        //     let key = Symbol('temp')
        //     Object.defineProperty(ctx,key,{
        //         enumerable:false,
        //         value:this
        //     })
        //     // ctx.fn = this; 会和ctx原本的属性重名
        //     let res = ctx[key](...args);
        //     delete ctx[key];
        //     return res
        // }


        // 第二种


        Function.prototype.mycall = function(ctx,...args){

            ctx = ctx||window
            ctx.fn = this;
            let res = ctx.fn(...args);
            delete ctx.fn
            return res
        }
        


        function method(a, b) {
            console.log(this, a, b);
            return a + b;
        }
        method.mycall({}, "1",2)

    </script>
</body>

</html>